package modele;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.AbstractListModel;
/**
 * Noyaux du programme. Contient les principales methodes de creation, de suppresion, d'ajout et de recherche.
 * @author Plancq Charlotte, Lanvin Kévin, Darras Raphael
 *
 */

public class Bdtheque extends AbstractListModel implements iBdtheque{
	private static final long serialVersionUID = 1L;
	/**
	 * Contient la liste des collections d'albums contenues dans la BDtheque.
	 */
	private ArrayList<CollectionAlbums>listeCollections;
	/**
	 * Represente l'affiche actuellement affiche a l'ecran.
	 */
	protected int affichageCourant;
	/**
	 * Contient une liste de genres a proposer a l'utilisateur lors de la creation d'un album.
	 */
	protected List<String> genres;
	/**
	 * Constructeur de la classe
	 * @throws IOException
	 */
	public Bdtheque() throws IOException{
		this.setListeCollections(new ArrayList<CollectionAlbums>());
		this.affichageCourant=0;	
		getListeCollections().add(new CollectionAlbums(this, "Tous"));

		String [] temp = {"Action", "Anticipation", "Artbooks", "Aventure", "Documentaire", "Drame", "Erotique", "Esoterisme",
				"Fantastique", "Fantasy", "Guerre", "Heroic Fantasy", "Historique", "Horreur", "Humour", "Jeunesse", "Polar",
				"Romance", "Romans Graphiques", "Science Fiction", "Sport", "Thriller", "Tranches de vie", "Western"};
		this.genres=new ArrayList<String>();
		for (int i =0; i<temp.length ; i++)
			genres.add(temp[i]);
	}

	/**
	 * Donne la liste des collections de la BDtheque	
	 * @return ArrayList<CollectionAlbums>
	 */
	public ArrayList<CollectionAlbums>getCollections (){
		return this.getListeCollections();
	}
	/**
	 * Attribue une liste de collection a la BDtheque
	 * @param ArrayList<CollectionAlbums collections
	 */
	public void setCollections (ArrayList<CollectionAlbums> collections){
		this.setListeCollections(collections);
	}
	/**
	 * Retourne l'album contenu a la position i dans la 
	 * collection 0 qui contient tout les albums de la BDtheque
	 * @param int i
	 * @return Album
	 */

	public Album getAlbum(int i){
		return getListeCollections().get(0).getElementAt(i);
	}

	/**
	 * Ajoute l'album a dans la collection c de la BDtheque.
	 * Retourne vrai s'il n'y a pas d'erreurs
	 * @param Album a
	 * @param Collection c
	 * @return boolean
	 */
	public boolean addAlbum(Album a,int c){
		return getListeCollections().get(c).add(a);
	}	
	/**
	 * Supprime l'album a de la collection c de la BDTheque.
	 * Retourne vrai s'il n'y a pas d'erreur
	 * @param Album a
	 * @param COllection c
	 * @return boolean
	 */
	public boolean supprimerAlbum(Album a,CollectionAlbums c){
		for(CollectionAlbums col : getListeCollections()){
			if(c.equals(col)){
				col.remove(a);
				return true;
			}
		}
		return false;
	}
	/**
	 * Recherche les albums dans la collection 0
	 * correspondant a l'album entre en parametre
	 * et en retourne une liste
	 * @param Album a
	 * @return List<Album>
	 */
	public List<Album> rechercherAlbum(Album a){
		List<Album>resultat=new ArrayList<Album>();
		resultat.addAll(this.getElementAt(0).rechercherAlbum(a));
		return resultat;
	}
	/**
	 * retourne tout les albums que la BDtheque possede.
	 * @return ArrayList<Album>
	 */
	public ArrayList<Album> getAlbums() {
		return (ArrayList<Album>) getListeCollections().get(0).getAlbums();
	}

	/**
	 * Retourne tout les auteurs (avec doublons) 
	 * ayant ecrit un album que la BDtheque possede.
	 * @return ArrayList
	 */
	public ArrayList<String> getAuteurs() {
		ArrayList<String> temp = new ArrayList<String>();
		for (int i=0 ; i<getListeCollections().get(0).getAlbums().size(); i++)
			temp.add(getListeCollections().get(0).getElementAt(i).getAuteur());
		return temp;
	}
	/**
	 * Retourne tout les editeur (avec doublons) 
	 * ayant publie un album que la BDtheque possede.
	 * @return ArrayList
	 */
	public ArrayList<String> getEditeurs() {
		ArrayList<String> temp = new ArrayList<String>();
		for (int i=0 ; i<getListeCollections().get(0).getAlbums().size(); i++)
			temp.add(getListeCollections().get(0).getElementAt(i).getEditeur());
		return temp;
	}
	/**
	 * Retourne tout les genre (avec doublons) 
	 * auquel appartiennent les albums de la BDtheque
	 * @return ArrayList
	 */
	public ArrayList<String> getGenres() {
		return (ArrayList<String>) this.genres;
	}
	/**
	 * Retourne tout les titres (avec doublons) 
	 * des albums que la BDtheque possede.
	 * @return ArrayList
	 */

	public ArrayList<String> getTitres() {
		ArrayList<String> temp = new ArrayList<String>();
		for (int i=0 ; i<getListeCollections().get(0).getAlbums().size(); i++)
			temp.add(getListeCollections().get(0).getElementAt(i).getTitre());
		return temp;
	}
	/**
	 * Met a l'ecran l'affiche correspondant a l'int entre en parametre
	 * @param int i
	 */
	public void setAffichage(int i){
		affichageCourant=i;
	}

	/**
	 * retourne l'affichage actuellement a l'ecran
	 * @return int
	 */
	public int getAffichage(){
		return affichageCourant;
	}
	/**
	 * Retourne la i-eme collection de la BDtheque
	 * @return COllectionAlbums
	 */
	@Override
	public CollectionAlbums getElementAt(int i) {
		return getListeCollections().get(i);
	}
	/**
	 * Retourne le nombre de collection de la BDtheque
	 * @return int i
	 */
	@Override
	public int getSize() {
		return getListeCollections().size();
	}

	/**
	 * Ajoute une collection a la BDtheque
	 * @param CollectionAlbums
	 */
	public void addCollection(CollectionAlbums collectionAlbums) {
		// TODO Auto-generated method stub
		this.getListeCollections().add(collectionAlbums);
	}
	/**
	 * Retourne la liste de toutes les collections de la BDtheque
	 * @return ArrayList
	 */
	public ArrayList<CollectionAlbums> getListeCollections() {
		return listeCollections;
	}

	/**
	 * Redefini la liste de toute les collections de la BDtheque
	 * avec la liste passee en parametre
	 * @param ArrayList
	 */
	public void setListeCollections(ArrayList<CollectionAlbums> listeCollections) {
		this.listeCollections = listeCollections;
	}
}
